//
//  Schema.swift
//  SLDatabase
//
//  Created by 姚胜龙 on 2017/7/7.
//  Copyright © 2017年 姚胜龙. All rights reserved.
//

import UIKit

/**
 * 模式 -> 构建者模式 ：具体构建者
 */

public final class TableBuilder {

    //字段列表（表达式数组）
    fileprivate var expresions = [Expressible]()

    //方法重载一 （重载的是默认值）
    //方法泛型<V: Value>
    //参数一：字段名称
    //参数二：是否是唯一（默认是 不唯一）
    //参数三：字段默认值-> 表达式类型：Expression<V>? = nil
    @discardableResult public func column<V: Value>(_ name: Expression<V>, _ unique: Bool = false, defaultValue: Expression<V>? = nil) -> TableBuilder {
        return self.column(name, V.declareDataType, unique, defaultValue: defaultValue)
    }

    //方法重载二 （重载的是默认值）
    //参数一：字段名称
    //参数二：是否是唯一（默认是 不唯一）
    //参数三：字段默认值-> 表达式类型 -> V:Value类型->也就是Int Double ...
    @discardableResult public func column<V: Value>(_ name: Expression<V>, _ unique: Bool = false, defaultValue: V?) -> TableBuilder {
        return self.column(name, V.declareDataType, unique, defaultValue: defaultValue)
    }

    //方法重载二 （重载的是默认值）
    //实现
    @discardableResult public func column(_ name: Expressible, _ dataType:String, _ unique: Bool = false, defaultValue: Expressible?) -> TableBuilder {
        //组装、拼接
        self.expresions.append(expressionFunc(name, dataType, true,unique, defaultValue: defaultValue))
        return self
    }

    //根据需求可以继续重载方法。。。

    private func expressionFunc(_ name: Expressible, _ dataType:String, _ isNull:Bool,_ unique: Bool = false, defaultValue: Expressible?) -> Expressible {
        //拼接字段名称 和 字段类型
        let expressionArray :[Expressible?] = [
            name, //字段名称
            dataType,//字段类型
            isNull ? nil : Expression<Void>(literal:"NOT NULL"), //是否为空
            unique ? Expression<Void>(literal:"UNIQUE") : nil,//是否唯一
            defaultValue.map{"DEFAULT".prefix( $0 )}
        ]
        //给每个字段表达式加上空格
        return " ".join(expressionArray.flatMap{ $0 }).expression
    }
}

extension QueryType {
    //创建表 -> 处理
    //参数一：创建表字段 TABLE
    //参数二：表名
    //返回值：抽象产品
    func  create(_ identifier:String, _ name:Expressible?) -> Expressible {
        let createArray:[Expressible?] = [
            Expression<Void>(literal: "CREATE"),//创建表关键字
            Expression<Void>(literal: identifier),
            name
        ]
        //添加空格,转换成字符串
        return " ".join(createArray.flatMap{ $0 })
    }
}

//统一的组装类
extension Table {
    //创建表 -> 构建
    //参数一：闭包传递构建者
    func create(_ build:(TableBuilder) -> Void) -> String {
        let tableBuilder = TableBuilder()
        build(tableBuilder)
        //一部分：create(Table.identifier, tableName()) -> create table t_user
        //一部分参数"".wrap(tableBuilder.expresions)->(t_user_name,t_user_sex)
        let expression:[Expressible?] = [
            create(Table.identifier, tableName()),
            "".wrap(tableBuilder.expresions) as Expression<Void>
        ]
        return " ".join(expression.flatMap{ $0 }).asSQL()
    }
}

